package coint.btc.util;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ui.ModelMap;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;

import java.util.Set;

/**
 * @Description: 
 * @author: wf  
 * @time: 2018年3月8日 下午2:18:04 
 */
public class HttpUtil {

	 /**
     * 组装post请求的数据
     * @param map
     * @return String
     */
    public static String assembleParam(Map<String, String> map) {
        StringBuilder sb = new StringBuilder();
        Set<Entry<String, String>> entries = map.entrySet();
        for (Entry<String, String> entry : entries) {
            sb.append(entry.getKey() + "=" + entry.getValue() + "&");
        }
        return sb.deleteCharAt(sb.length() - 1).toString();
    }
    /* 日志对象 */
    private static final Logger log = LoggerFactory.getLogger(HttpUtil.class);

    /* 发送文本内容 */
    public static final Integer TYPE_TEXT = 1;
    /* 发送JSON内容 */
    public static final Integer TYPE_JSON = 2;

    /**
     * 向指定路径发送GET请求, 封装返回数据为ModelMap实例
     * @param   url 目标路径
     * @return  远程服务器的响应结果
     * @author  Zc
     * @since   2017年6月5日 上午9:11:11
     */
    public static ModelMap getJson(String url) {
        return JSON.parseObject(get(url), ModelMap.class);
    }

    /**
     * 向指定路径发送GET请求, 封装返回数据为ModelMap实例
     * @param   url     目标路径
     * @param   params  携带参数
     * @return  远程服务器的响应结果
     * @author  Zc
     * @since   2017年6月5日 上午9:11:11
     */
    public static ModelMap getJson(String url, String... params) {
        return JSON.parseObject(get(url, assembleParam(params)), ModelMap.class);
    }

    /**
     * 向指定路径发送GET请求, 封装返回数据为ModelMap实例
     * @param   url     目标路径
     * @param   params  携带参数
     * @return  远程服务器的响应结果
     * @author  Zc
     * @since   2017年6月5日 上午9:11:11
     */
    public static ModelMap getJson(String url, Object... params) {
        return JSON.parseObject(get(url, assembleParam(params)), ModelMap.class);
    }

    /**
     * 用户自行转换参数拼接后
     * @param   url     目标路径
     * @param   param   携带参数
     * @return  远程服务器的响应结果
     * @author  Zc
     * @since   2017年6月14日 上午8:59:36
     */
    public static ModelMap getJsonCustom(String url, String param) {
        return JSON.parseObject(get(url, param), ModelMap.class);
    }

    /**
     * 向指定路径发送GET请求
     * @param   url 目标路径
     * @return  远程服务器的响应结果字符串
     * @author  Zc
     * @since   2017年4月27日 下午4:28:11
     */
    public static String get(String url) {
        return get(url, null);
    }

    /**
     * 向指定路径发送GET请求
     * @param   url     目标路径
     * @param   param   携带参数, 以键值对的形式拼串
     * @return  远程服务器的响应结果字符串
     * @author  Zc
     * @since   2017年4月27日 下午4:28:11
     */
    public static String get(String url, String param) {
        StringBuilder result = new StringBuilder();
        BufferedReader in = null;
        /* 延迟实例化, 所以不能使用TWR */
        try {
            /* 1.url拼装 */
            String fullUrl = "";
            if (StringUtils.isNotBlank(param)) {
                fullUrl += url + "?" + param;
            } else {
                fullUrl += url;
            }
            URL realUrl = new URL(fullUrl);
            /* 2.打开和URL之间的连接 */
            URLConnection conn = realUrl.openConnection();
            /* 3.设置通用的请求属性 */
            /*conn.setRequestProperty("cookie", ShiroUtil.getCookie());*/
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            /* 4.建立实际的连接 */
            conn.connect();
            /* 5.使用输入流来读取远程服务器的响应结果, 同时防止乱码 */
            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
            String line;
            while ((line = in.readLine()) != null) {
                result.append(line);
            }
        } catch (Exception e) {
            log.debug("发送GET请求如下异常:\r\n{}", e);
            e.printStackTrace();
        } finally {
            /* 6.关闭资源 */
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return result.toString();
    }

    /**
     * 向指定路径发送POST请求, 封装返回数据为ModelMap实例
     * @param   url 目标路径
     * @return  远程服务器的响应结果
     * @author  Zc
     * @since   2017年6月5日 上午9:14:22
     */
    public static ModelMap postJson(String url) {
        return JSON.parseObject(post(url), ModelMap.class);
    }


    public static List postListObjectJson(String url) {
        return JSON.parseObject(post(url), List.class);
    }

    public static Long postLongJson(String url, Object... params) {
        return JSON.parseObject(post(url, assembleParam(params)), Long.class);
    }

    public static Object postObjctJson(String url, Object... params) {
        return JSON.parseObject(post(url, assembleParam(params)), Object.class);
    }

    public static String postStringJson(String url) {
        return JSON.parseObject(get(url), String.class);
    }

    /**
     * 向指定路径发送POST请求, 封装返回数据为ModelMap实例
     * @param   url     目标路径
     * @param   params  携带参数, 以键值对的形式拼串
     * @return  远程服务器的响应结果
     * @author  Zc
     * @since   2017年6月5日 上午9:14:22
     */
    public static ModelMap postJson(String url, String... params) {
        return JSON.parseObject(post(url, assembleParam(params)), ModelMap.class);
    }

    /**
     * 向指定路径发送POST请求, 封装返回数据为ModelMap实例
     * @param   url     目标路径
     * @param   params  携带参数, 以键值对的形式拼串
     * @return  远程服务器的响应结果
     * @author  Zc
     * @since   2017年6月5日 上午9:14:22
     */
    public static ModelMap postJson(String url, Object... params) {
        return JSON.parseObject(post(url, assembleParam(params)), ModelMap.class);
    }

    /**
     * 用户自行转换参数拼接后
     * @param   url     目标路径
     * @param   params  携带参数
     * @return  远程服务器的响应结果
     * @author  Zc
     * @since   2017年6月14日 上午8:59:36
     */
    public static ModelMap postJsonCustom(String url, String... params) {
        return JSON.parseObject(post(url, assembleParam(params)), ModelMap.class);
    }

    /**
     * 向指定路径发送POST请求
     * @param   url 目标路径
     * @return  远程服务器的响应结果字符串
     * @author  Zc
     * @since   2017年4月27日 下午4:36:23
     */
    public static String post(String url) {
        return post(url, null);
    }

    /**
     * 向指定路径发送POST请求
     * @param   url     目标路径
     * @param   params  携带参数, 以键值对的形式拼串
     * @return  远程服务器的响应结果字符串
     * @author  Zc
     * @since   2017年4月27日 下午4:36:23
     */
    public static String post(String url, String param) {
        PrintWriter out = null;
        BufferedReader in = null;
        StringBuilder result = new StringBuilder();
        try {
            URL realUrl = new URL(url);
            /* 1.打开和URL之间的连接 */
            URLConnection conn = realUrl.openConnection();
            /* 2.设置通用的请求属性 */
           /* conn.setRequestProperty("cookie", ShiroUtil.getCookie());*/
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            /* 3.发送POST请求必需设置 */
            conn.setDoOutput(true);
            conn.setDoInput(true);
            /* 4.获取URLConnection对象对应的输出流 */
            out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8"));
            /* 5.发送请求参数 */
            out.print(param);
            /* 6.flush输出流的缓冲 */
            out.flush();
            /* 7.使用输入流来读取远程服务器的响应结果, 同时防止乱码 */
            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
            String line;
            while ((line = in.readLine()) != null) {
                result.append(line);
            }
        } catch (Exception e) {
            log.debug("发送 POST请求出现如下异常:\r\n{}", e);
            e.printStackTrace();
        }
        /* 8.关闭资源 */
        finally {
            try {
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    in.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result.toString();
    }

    /**
     * 转换参数
     * @param   params  目标对象
     * @return  处理好的参数字符串
     * @author  Zc
     * @since   2017年6月6日 上午10:49:07
     */
    public static String assembleParam(String... params) {
        StringBuilder sb = new StringBuilder();
        if (params != null) {
            String value = null;
            String[] arr;
            for (String param : params) {
                if (!param.contains("=")) {
                    continue;
                }
                arr = param.split("=");
                if (arr.length <= 1) {
                    continue;
                }
                value = arr[1];
                if (StringUtils.isNotBlank(value)) {
                    if (value.equals("null")) {
                        sb.append(arr[0]).append("=&");
                    } else {
                        sb.append(param).append("&");
                    }
                }
            }
            if (sb.length() > 1) {
                return sb.substring(0, sb.length() - 1);
            }
        }
        return null;
    }
    

    /**
     * @param arr
     * @return
     * @author  Zc
     * @since   2017年6月15日 下午12:16:05
     */
    public static String assembleParam(Object... arr) {
        if (arr == null) {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        for (Object obj : arr) {
            if (obj == null) {
                continue;
            }
            String json = JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
            json = json.substring(1, json.length() - 1);
            if (StringUtils.isBlank(json)) {
                continue;
            }
            String[] strArr = json.split("\\,\"");
            for (String str : strArr) {
                String[] subArr = str.split("\\:");
                if (subArr.length <= 1 || StringUtils.isEmpty(subArr[1])) {
                    continue;
                }
                sb.append(subArr[0].replace("\"", "") + "="
                        + str.substring(subArr[0].length() + 1, str.length()).replace("\"", "") + "&");
            }
        }
        return sb.substring(0, sb.length() - 1);
    }
	

    /**
     * 对基本类型数组进行转换
     * @param   name    将要赋予的名字
     * @param   arr     要被处理的数组
     * @return  处理好的参数字符串
     * @author  Zc
     * @since   2017年6月14日 上午8:49:05
     */
    public static String assembleParam(String name, Integer[] arr) {
        if (arr != null) {
            StringBuilder sb = new StringBuilder();
            for (int num : arr) {
                sb.append(name).append("=").append(num).append("&");
            }
            return sb.substring(0, sb.length() - 1);
        }
        return null;
    }
    
    
        /**
          * 
          * @param urlPath
          *            下载路径
          * @param downloadDir
          *            下载存放目录
          * @return 返回下载文件
          */
         public static File downloadFile(String urlPath, String downloadDir) {
             File file = null;
             try {
                 // 统一资源
                 URL url = new URL(urlPath);
                // 连接类的父类，抽象类
                 URLConnection urlConnection = url.openConnection();
                // http的连接类
                 HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;
                 // 设定请求的方法，默认是GET
                 httpURLConnection.setRequestMethod("POST");
                 // 设置字符编码
                 httpURLConnection.setRequestProperty("Charset", "UTF-8");
                 // 打开到此 URL 引用的资源的通信链接（如果尚未建立这样的连接）。
                 httpURLConnection.connect();
     
                 // 文件大小
                 int fileLength = httpURLConnection.getContentLength();
     
                 // 文件名
                 String filePathUrl = httpURLConnection.getURL().getFile();
                 String fileFullName = filePathUrl.substring(filePathUrl.lastIndexOf(File.separatorChar) + 1);
     
                 System.out.println("file length---->" + fileLength);
     
                 URLConnection con = url.openConnection();
     
                 BufferedInputStream bin = new BufferedInputStream(httpURLConnection.getInputStream());
     
                 String path = downloadDir + File.separatorChar + fileFullName;
                 file = new File(path);
                 if (!file.getParentFile().exists()) {
                     file.getParentFile().mkdirs();
                 }
                 OutputStream out = new FileOutputStream(file);
                 int size = 0;
                 int len = 0;
                 byte[] buf = new byte[1024];
                 while ((size = bin.read(buf)) != -1) {
                     len += size;
                     out.write(buf, 0, size);
                     // 打印下载百分比
                     // System.out.println("下载了-------> " + len * 100 / fileLength +
                     // "%\n");
                 }
                 bin.close();
                 out.close();
             } catch (MalformedURLException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             } catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             } finally {
                 return file;
             }
     
         }
         /**
          * 
          * @Description: 将文件名称进行修改
          * @date:2018年5月28日   
          * @author: lt
          * @param file
          * @param toFile
          */
         public static void renameFile(String file, String toFile) {  
        	  
             File toBeRenamed = new File(file);  
             //检查要重命名的文件是否存在，是否是文件  
             if (!toBeRenamed.exists() || toBeRenamed.isDirectory()) {  
       
                 System.out.println("File does not exist: " + file);  
                 return;  
             }  
       
             File newFile = new File(toFile);  
       
             //修改文件名  
             if (toBeRenamed.renameTo(newFile)) {  
                 System.out.println("File has been renamed.");  
             } else {  
                 System.out.println("Error renmaing file");  
             }  
       
         }  
         
         public static void main(String[] args) {
        	 new HttpUtil().renameFile("D:\\resume\\personVct\\sentsss.pdf", "D:\\\\resume\\\\personVct\\\\王亚雄.pdf");  
		}
    
    
    
  

}
